package org.ffmmx.common.util;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.ffmmx.common.model.Token;

import java.util.Date;

public class TokenUtil {
    private static final String magicWords = "!@#$%^%$#$#";


    /**
     * 验证令牌
     * @param token
     * @return
     */
    public static Boolean validateToken(String token) {
        Token token1 = parseToken(token);
        if(token1 == null)
            return false;
        return generateSign(token1.getUserId(),token1.getProfileJson(),token1.getExpireTime()).equals(token.split("\\.")[1]);
    }

    /**
     * 生成令牌
     * @param userId 用户id
     * @param profileJson 身份信息JSON
     * @param expireTime 过期时间
     * @return
     */
    public static String generateToken(String userId, String profileJson, Date expireTime) {
        return generateTokenProfile(userId,profileJson,expireTime)+"."+generateSign(userId,profileJson,expireTime);
    }

    /**
     * 解析令牌返回令牌数据
     * @param token
     * @return
     */
    public static Token parseToken(String token) {
        if (StringUtils.isEmpty(token)) {
            throw new RuntimeException("令牌为空");
        }
        final String[] ts = token.split("\\.");
        if (ts.length == 2) {
            final String[] tss = new String(Base64.decodeBase64(ts[0])).split(";");
            if (tss.length == 3) {
                final Token token1 = new Token();
                token1.setUserId(tss[0]);
                token1.setProfileJson(tss[1]);
                token1.setExpireTime(new Date(Long.parseLong(tss[2])));
                return token1;
            }
        }
        return null;
    }

    /**
     * 生成令牌身份串
     * @param userId 用户id
     * @param profileJson 用户身份信息
     * @param expireTime 过期时间
     * @return
     */
    public static String generateTokenProfile(String userId, String profileJson, Date expireTime) {
        if (StringUtils.isEmpty(userId)) {
            throw new RuntimeException("用户主键为空");
        }
        if (expireTime == null) {
            throw new RuntimeException("过期时间为空");
        }
        if (profileJson == null) {
            profileJson = "";
        }

        return Base64.encodeBase64String((userId + ";" + profileJson + ";" + expireTime.getTime()).getBytes());
    }

    /**
     * 生成令牌签名
     * @param userId 用户id
     * @param profileJson 用户身份信息
     * @param expireTime 过期时间
     * @return
     */
    public static String generateSign(String userId, String profileJson, Date expireTime) {
        if (StringUtils.isEmpty(userId)) {
            throw new RuntimeException("用户主键为空");
        }
        if (expireTime == null) {
            throw new RuntimeException("过期时间为空");
        }
        if (profileJson == null) {
            profileJson = "";
        }
        return DigestUtils.md2Hex(userId + magicWords + profileJson + magicWords + expireTime.getTime());
    }


}
